package impl

import (
	"gitee.com/wang-xiangyu20000112/vblog/apps/user/dao"
	"gitee.com/wang-xiangyu20000112/vblog/apps/user/vo"
	"gitee.com/wang-xiangyu20000112/vblog/comment"
	"gitee.com/wang-xiangyu20000112/vblog/logger"
	"gitee.com/wang-xiangyu20000112/vblog/utils"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"net/http"
	"time"
)

type UserServiceImpl struct{}

// 定义返回结果实例
var resp = &comment.Result{}

var err error

// 新增用户
func (i *UserServiceImpl) InsertUser(ctx *gin.Context, userVo *vo.UserVo) *comment.Result {
	// 记录日志
	logger.ZapLogger.Info("InsertUser", zap.Any("userVo", userVo))

	// 参数校验
	if userVo == nil {
		// 记录日志
		logger.ZapLogger.Error("未接受到用户信息", zap.Any("userVo", userVo))
		return resp.Fail("用户信息为空", comment.BAD_REQUEST, nil)
	}

	if userVo.Password == "" {
		return resp.Fail("请输入密码", comment.BAD_REQUEST, nil)
	}
	// 对密码进行加密
	// 使用bcrypt对密码进行hash加密
	userVo.Password = utils.BcryptEncode(userVo.Password)
	if err != nil {
		return resp.Fail("密码加密失败", comment.BAD_REQUEST, nil)
	}

	// 填充日期字段
	userVo.UpdateTime = time.Now().Format("2006-01-02 15:03:04")
	userVo.CreateTime = time.Now().Format("2006-01-02 15:03:04")

	// 创建用户
	result := dao.InsertUser(ctx, userVo.User)
	// 校验结果是否正确创建
	if result.RowsAffected < 1 || result.Error != nil {
		return resp.Fail("创建失败", http.StatusInternalServerError, result.Error)
	}

	// 记录日志
	logger.ZapLogger.Info("InsertUser", zap.Any("userVo", userVo))
	// 返回成功信息
	return resp.Success("用户添加成功", nil, http.StatusOK)
}

// 删除用户
func (i *UserServiceImpl) DeleteUser(ctx *gin.Context, userVo *vo.UserVo) *comment.Result {
	// 记录日志
	logger.ZapLogger.Info("DeleteUser", zap.Any("userVo", userVo))

	// 参数校验
	if userVo == nil {
		// 记录日志
		logger.ZapLogger.Error("未接受到用户信息", zap.Any("userVo", userVo))
		return resp.Fail("用户信息为空", comment.BAD_REQUEST, nil)
	}

	// 删除用户
	result := dao.DeleteUser(ctx, userVo.User)
	// 校验结果是否正确删除
	if result.RowsAffected < 1 || result.Error != nil {
		return resp.Fail("删除失败", http.StatusInternalServerError, result.Error)
	}

	// 返回成功信息
	return resp.Success("用户删除成功", nil, http.StatusOK)
}

// 修改用户
func (i *UserServiceImpl) UpdateUser(ctx *gin.Context, userVo *vo.UserVo) *comment.Result {
	// 记录日志
	logger.ZapLogger.Info("UpdateUser", zap.Any("userVo", userVo))

	// 参数校验
	if userVo == nil {
		// 记录日志
		logger.ZapLogger.Error("未接受到用户信息", zap.Any("userVo", userVo))
		return resp.Fail("用户信息为空", comment.BAD_REQUEST, nil)
	}

	// 判断用户传入的密码是否为空 若不为空加密后在存储
	if userVo.Password != "" {
		userVo.Password = utils.BcryptEncode(userVo.Password)
	}

	// 修改用户信息
	result := dao.UpdateUser(ctx, userVo.User)
	// 校验结果是否正确修改
	if result.RowsAffected < 1 || result.Error != nil {
		return resp.Fail("修改失败", http.StatusInternalServerError, result.Error)
	}

	// 返回成功信息
	return resp.Success("用户修改成功", nil, http.StatusOK)
}

func (i *UserServiceImpl) FindUserById(ctx *gin.Context, id any) *comment.Result {
	user, err := dao.FindUser(ctx, id)
	// 校验结果是否正确
	if user == nil || err != nil {
		return resp.Fail("用户不存在", http.StatusNotFound, err)
	}
	// 封装查询到的信息
	userVo := &vo.UserVo{User: user}
	// 返回成功信息
	return resp.Success("用户查询成功", userVo, http.StatusOK)
}
